package org.example.test_drools;

import org.kie.api.KieServices;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.utils.KieHelper;

import java.io.InputStreamReader;
import java.io.Reader;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {

    public static void main(String[] args) {
        //endTest();
        minTest();
        maxTest();
        sumTest();
        avgTest();
        absTest();
        ceilTest();
        floorTest();
        powTest();
        modTest();
        logTest();
        concatTest();
    }

    private static void endTest() {
        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/endTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void minTest() {
        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/minTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();

        List<Integer> list = new ArrayList<Integer>();
        list.add(6);
        list.add(2);
        list.add(3);
        list.add(5);
        list.add(1);
        list.add(4);
        kieSession.insert(list);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void maxTest() {
        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/maxTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();

        List<Integer> list = new ArrayList<Integer>();
        list.add(6);
        list.add(2);
        list.add(3);
        list.add(5);
        list.add(1);
        list.add(4);
        kieSession.insert(list);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void sumTest() {
        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/sumTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();

        List<BigDecimal> list = new ArrayList<BigDecimal>();
        list.add(new BigDecimal("6"));
        list.add(new BigDecimal("2"));
        list.add(new BigDecimal("3"));
        list.add(new BigDecimal("5"));
        list.add(new BigDecimal("1"));
        list.add(new BigDecimal("4"));
        kieSession.insert(list);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void avgTest() {
        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/avgTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();

        List<BigDecimal> list = new ArrayList<BigDecimal>();
        list.add(new BigDecimal("6"));
        list.add(new BigDecimal("2"));
        list.add(new BigDecimal("3"));
        list.add(new BigDecimal("5"));
        list.add(new BigDecimal("1"));
        list.add(new BigDecimal("4"));
        kieSession.insert(list);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void absTest() {
        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/absTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void ceilTest() {
        BigDecimal d = new BigDecimal("1.33333");

        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/ceilTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();
        kieSession.insert(d);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void floorTest() {
        BigDecimal d = new BigDecimal("1.33333");

        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/floorTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();
        kieSession.insert(d);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void powTest() {
        BigDecimal d = new BigDecimal("1.33333");

        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/powTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();
        kieSession.insert(d);
        kieSession.insert(3);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void modTest() {
        BigDecimal d = new BigDecimal("15");

        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/modTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();
        kieSession.insert(d);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void logTest() {
        BigDecimal d = new BigDecimal("15");

        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/logTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();
        kieSession.insert(d);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    private static void concatTest() {
        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/test/concatTest.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();

        List<Object> list = new ArrayList<Object>();
        list.add("abc");
        list.add("   ");
        list.add("XYZ");
        list.add("   ");
        list.add(new Object());
        kieSession.insert(list);

        kieSession.fireAllRules();
        kieSession.dispose();
    }

    /**
     * 从文件中读取规则
     */
    private static void ruleFromFile() {
        KieServices kieServices = KieServices.Factory.get();
        KieContainer kieContainer = kieServices.getKieClasspathContainer();
        KieSession kieSession = kieContainer.newKieSession("test_session");
        kieSession.fireAllRules();
    }

    /**
     * 从字符串读取规则
     */
    private static void ruleFromString() {
        Number n = null;

        String ruleContent0 = getRuleString("/rules/functions.drl");
        String ruleContent1 = getRuleString("/rules/func_isBigOrder.drl");
        String ruleContent2 = getRuleString("/rules/Order.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent0, ResourceType.DRL);
        kieHelper.addContent(ruleContent1, ResourceType.DRL);
        kieHelper.addContent(ruleContent2, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();

        Order order = new Order();
        order.setAmount(5000);

        kieSession.insert(order);
        kieSession.fireAllRules();

        kieSession.dispose();

        System.out.println("积分======>" + order.getScore());
    }

    /**
     * 从字符串读取规则
     */
    private static void ruleMap() {
        String ruleContent = getRuleString("/rules/Map.drl");

        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(ruleContent, ResourceType.DRL);

        KieSession kieSession = kieHelper.build().newKieSession();

        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "张三");
        map.put("age", "10");

        kieSession.insert(map);
        kieSession.fireAllRules();

        kieSession.dispose();
    }

    private static String getRuleString(String filePath) {
        Reader r = null;
        try {
            r = new InputStreamReader(Order.class.getResourceAsStream(filePath));
            StringBuilder buf = new StringBuilder();
            int c = -1;
            while ((c = r.read()) > -1) {
                buf.append((char) c);
            }
            return buf.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            if (r != null) {
                try {
                    r.close();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

}
